package dataspace

import (
	"io"
	"os"
)

// Метод записывает все актуальные данные в файл.
func (ds *Dataspace) flush() error {
	for e := ds.list.front(); e != nil; e = e.nextElement() {
		if node := ds.tree.search(e.value); node != nil {
			data := encode(&fraction{
				m: 1,
				s: true,
				k: node.key,
				v: node.value,
			})
			if _, err := ds.writer.Write(data); err != nil {
				return err
			}
		}
	}
	return ds.writer.Flush()
}

/*
Метод создаёт резервный временный файл, затем копирует в него
все данные. Далее очищает данные из основного wal-журнала и
перезаписывает в порядке добавления с помощью списка.
*/
func (ds *Dataspace) Vacuum() error {
	f, err := os.Create(ds.path + ".temp")
	if err != nil {
		return err
	}
	if _, err := ds.wal.Seek(0, 0); err != nil {
		return err
	}
	if _, err := io.Copy(f, ds.wal); err != nil {
		return err
	}
	if err := ds.wal.Truncate(0); err != nil {
		return err
	}
	if _, err := ds.wal.Seek(0, 0); err != nil {
		return err
	}
	if err := ds.flush(); err != nil {
		return err
	}
	if err := f.Close(); err != nil {
		return err
	}
	return os.Remove(ds.path + ".temp")
}
